package org.dromara.demo.designPattern.lsp.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;
import java.util.List;

//信用卡
public class CreditCard extends CashCard {

    private final Logger logger = LoggerFactory.getLogger(CreditCard.class);

    /**
     * 贷款
     *
     * @param orderId 订单编号
     * @param amount  提款金额
     * @return 返回操作结果代码，"0000"表示成功，"0001"表示金额超限
     */
    @Override
    public String withdrawal(String orderId, BigDecimal amount) {
        // 校验
        if (amount.compareTo(new BigDecimal(1000)) >= 0) {
            logger.info("贷款金额校验(限额1000元)，单号：{} 金额{}", orderId, amount);
            return "0001";
        }
         // 模拟生成贷款单
        logger.info("生成贷款单，单号：{} 金额：{}", orderId, amount);
        logger.info("贷款成功，单号：{} 金额：{}", orderId, amount);
        return "0000";
    }

    /**
     * 还款
     *
     * @param orderId 订单号
     * @param amount  充值金额
     * @return 返回操作结果，返回"0000"表示操作成功
     */
    @Override
    public String recharge(String orderId, BigDecimal amount) {
         // 模拟生成还款单
        logger.info("生成还款单，单号：{} 金额：{}", orderId,amount);
        // 模拟还款成功
        logger.info("还款成功，单号：{} 金额：{}", orderId,amount);
        return "0000";
    }

    /**
     * 信用卡的交易流水，可以直接复用父类的方法
     * @return : 交易流水
     */
    @Override
    public List<String> tradeFlow() {
        return super.tradeFlow();
    }

    /**
     * 信用卡的功能实现是在继承了储蓄卡类后，进行方法重写：支付
     * withdrawal（）、还款recharge（）。其实交易流水可以复用，也可以不用重
     * 写这个类。
     * 这种继承父类方式的优点是复用了父类的核心功能逻辑，但是也破坏了原
     * 有的方法。此时继承父类实现的信用卡类并不满足里氏替换原则，也就是说，
     * 此时的子类不能承担原父类的功能，直接给储蓄卡使用。
     *
     * 总结 : 子类如果不能完全复用,父类的方法,则不应该继承父类.
     */
}
